﻿#pragma once

#include <breaking/base/no_copy_able.h>
#include <memory>
#include <mutex>
#include <iostream>

namespace breaking
{
	/**
	 * @brief 单例模板基类(线程安全)
	 */
	template<typename T>
	class singleton : public no_copy_able
	{
	protected:
		// 私有构造函数，防止外部通过new创建实例
		singleton() = default;

	public:
		/**
		 * @brief 静态公有函数，用于获取单例对象的引用
		 * @return
		 */
		static T& instance()
		{
			std::lock_guard<std::mutex> lock(s_mutex);
			if (!s_instance) {
				s_instance.reset(new T());
			}
			return *s_instance;
		}

	protected:
		// 静态实例指针，使用std::shared_ptr来管理单例的生命周期
		static std::shared_ptr<T> s_instance;
		// 静态锁，用于控制多线程环境下的线程安全
		static std::mutex s_mutex;
	};

	// 模板类静态成员的定义
	template<typename T>
	std::shared_ptr<T> singleton<T>::s_instance = nullptr;

	template<typename T>
	std::mutex singleton<T>::s_mutex;
};